package utils

import "bytes"

/*
PKCS7Padding 填充模式
text：明文内容
blockSize：分组块大小
*/
func BytePadding(text []byte, blockSize int) []byte {
	// 计算待填充的长度
	padding := blockSize - len(text)%blockSize
	var paddingText []byte
	if padding == 0 {
		// 已对齐，填充一整块数据，每个数据为 blockSize
		paddingText = bytes.Repeat([]byte{byte(blockSize)}, blockSize)
	} else {
		// 未对齐 填充 padding 个数据，每个数据为 padding
		paddingText = bytes.Repeat([]byte{byte(padding)}, padding)
	}
	return append(text, paddingText...)
}

/*
去除 PKCS7Padding 填充的数据
text 待去除填充数据的原文
*/
func UnBytePadding(text []byte) []byte {
	// 取出填充的数据 以此来获得填充数据长度
	unPadding := int(text[len(text)-1])
	return text[:(len(text) - unPadding)]
}

/**
 * 获取byte[]的实际的长度
 * @param bytes
 * @return
 */
func GetActualBytesLength(bytes []byte) int {
	var end = len(bytes)
	var em int = -1  //第一个0的位置
	var em1 int = -1 //0之后的位置
	for i := 0; i < end; i++ {
		if bytes[i] == 0 {
			em = i
			break
		}
	}
	//没有找到第一个0, 那么就代表这个数组是实际的数组
	if em == -1 {
		return end
	}
	//找最后一个非0的下标 ,那么代表这个数组后面可能还有值 ,下标继续向后走
	for i := em + 1; i < end; i++ {
		if bytes[i] != 0 {
			em1 = i
		}
	}
	//0后面没有值, 那么就代表第一个0的位置就是这个数组是实际的数组
	if em1 == -1 {
		return em
	}
	//找到了最后非0的数了,那么这个位置就是这个数组是实际的数组
	return em1 + 1 //因为是从0开始的所以需要+1
}

// 去除空字节,获取byte[]实际长度的数组, 例如: [104 117 97 110 109 105 110 0 0 0] -> [104 117 97 110 109 105 110]
func GetActualBytes(bytes []byte) []byte {
	if bytes == nil || len(bytes) == 0 {
		return nil
	}
	var bb = make([]byte, GetActualBytesLength(bytes))
	copy(bb, bytes)
	return bb
}
